package teste;

import org.junit.Test;

import saa.Configuracao;
import saa.model.UnidadePeriodoDisciplina;
import saa.model.Disciplina;
import saa.model.EmentaDisciplina;
import static junit.framework.Assert.*;

public class TesteUnidadePeriodoDisciplina {

    /**
     * Garante que os objetivos de nota e presença funcionam corretamente.
     */
    @Test
    public void testeObjetivos() {

        EmentaDisciplina ementa = new EmentaDisciplina("Português", 60);
        Disciplina disciplina = new Disciplina(ementa);
        
        // nota mínima das configurações do sistema
        assertEquals(60, disciplina.getObjetivoNota());
        
        // porcentagem mínima de presença do sistema
        assertEquals(75, disciplina.getObjetivoPresencaPorcentagem());
        
        // quantidade mínima de presença a partir da carga-horária
        assertEquals(75 * 60 / 100, disciplina.getObjetivoPresencaQuantidade());

        disciplina.setObjetivoNota(95);
        disciplina.setObjetivoPresencaPorcentagem(90);
        
        // alteração posterior do objetivo
        assertEquals(95, disciplina.getObjetivoNota());
        
        // alteração posterior de porcentagem de presença
        assertEquals(90, disciplina.getObjetivoPresencaPorcentagem());
        
        // calcula quantidade mínima de presença a partir da alteração da porcentagem
        assertEquals(90 * 60 / 100, disciplina.getObjetivoPresencaQuantidade());
    }

    /**
     * Garante que os objetivos de nota e presença (e falta) são distribuídos
     * corretamente entre os bimestres no momento da criação.
     */
    @Test
    public void testeObjetivoInicialPorBimestre() {

        EmentaDisciplina ementa = new EmentaDisciplina("Português", 60);
        Disciplina disciplina = new Disciplina(ementa);

        int faltas = disciplina.getQuantidadeMaximaDeFaltasPermitidas();
        assertEquals(faltas, 15);

        int qtdBimestres = disciplina.getBimestres().size(), indice = 1;
        
        for (UnidadePeriodoDisciplina bimestre : disciplina.getBimestres()) {
            if (indice == qtdBimestres) {
                assertEquals(bimestre.getFaltasPermitidas(), faltas);
            } else {
                assertEquals(bimestre.getFaltasPermitidas(), disciplina.getQuantidadeMaximaDeFaltasPermitidas()
                        / disciplina.getBimestres().size());
                
                faltas -= disciplina.getQuantidadeMaximaDeFaltasPermitidas()
                        / disciplina.getBimestres().size();
            }
            
            indice += 1;
            
            assertEquals(bimestre.getObjetivoNota(), Configuracao.notaMinimaParaPassar);
        }

        ementa.setCargaHoraria(120);
        disciplina.setEmenta(ementa);
        disciplina.setObjetivoNota(90);

        assertEquals(disciplina.getQuantidadeMaximaDeFaltasPermitidas(), 30);
        for (UnidadePeriodoDisciplina bimestre : disciplina.getBimestres()) {
            assertEquals(bimestre.getFaltasPermitidas(), disciplina.getQuantidadeMaximaDeFaltasPermitidas()
                    / disciplina.getBimestres().size());
            assertEquals(bimestre.getObjetivoNota(), 90);
        }

    }

    /**
     * Garante a contagem regressiva das faltas entre os bimestres e o semestre
     * como um todo.
     */
    @Test
    public void testeContagemDeFaltas() {
        EmentaDisciplina ementa = new EmentaDisciplina("Português", 60);
        Disciplina disciplina = new Disciplina(ementa);

        UnidadePeriodoDisciplina primeiroBimestre = disciplina.getBimestres().get(0);
        UnidadePeriodoDisciplina segundoBimestre = disciplina.getBimestres().get(1);
        
        // quantidade inicial de faltas permitidas
        assertEquals(primeiroBimestre.getQuantidadeDeFaltasRestantes(), 7);
        assertEquals(segundoBimestre.getQuantidadeDeFaltasRestantes(), 8);
        assertEquals(disciplina.getQuantidadeDeFaltasRestantes(), 15);

        primeiroBimestre.adicionarFaltas(7);
        
        // quantidade atualizada de faltas permitidas
        assertEquals(primeiroBimestre.getQuantidadeDeFaltasRestantes(), 0);
        assertEquals(segundoBimestre.getQuantidadeDeFaltasRestantes(), 8);
        assertEquals(disciplina.getQuantidadeDeFaltasRestantes(), 8);
        
        segundoBimestre.adicionarFaltas(8);
        
        // quantidade atualizada de faltas permitidas
        assertEquals(primeiroBimestre.getQuantidadeDeFaltasRestantes(), 0);
        assertEquals(segundoBimestre.getQuantidadeDeFaltasRestantes(), 0);
        assertEquals(disciplina.getQuantidadeDeFaltasRestantes(), 0);
    }

}